import { mutableHandlers, readonlyHandlers, shallowReadonlyHandlers } from './baseHandlers'

export const enum ReactiveFlags {
    IS_REACTIVE = "__v_isReactive",
    IS_READONLY = "__v_isReadonly",
}

export function reactive(raw) {
    return createActiveObject(raw, mutableHandlers);
}

export function readonly(raw) {
    return createActiveObject(raw, readonlyHandlers);
}

export function shallowReadonly(raw) {
    return createActiveObject(raw, shallowReadonlyHandlers);
}


/**
 * 根据传入的 handlers ，创建一个 Proxy 对象（ reactive 或者 readonly） 
 * @param raw 
 * @param baseHanders 
 * @returns 
 */
const createActiveObject = function (raw, baseHanders) {
    return new Proxy(raw, baseHanders);
}

export function isReadonly(raw) {
    // 利用访问对象的某个属性触发 proxy 对象的 get，在 get 中返回是否为 readonly 对象
    // 如果 raw 对象不是响应式对象，会导致获取的为 undefined 
    // 同时 get 中 target 对象不包含 __v_isReactive 字段，所以也会返回 undefined
    // 所以 使用 !!（双重取反），将 undefined 转换为 false 返回
    return !!raw[ReactiveFlags.IS_READONLY]
}

export function isReactive(raw) {
    // 利用访问对象的某个属性触发 proxy 对象的 get，在 get 中返回是否为 reactive 对象
    // 原理同 isReadonly
    return !!raw[ReactiveFlags.IS_REACTIVE]
}

export function isProxy(raw) { 
    return isReactive(raw) || isReadonly(raw);
}
